/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.comp.mbean;

import com.brain.comp.dto.CotizacionProveedoresDetaDto;
import com.brain.comp.dto.CotizacionProveedoresDto;
import com.brain.comp.manager.CotizacionProveedoresDetaManager;
import com.brain.comp.manager.CotizacionProveedoresManager;
import com.brain.comp.view.util.ConstantesComp;
import com.brain.conf.dto.TerceroDto;
import com.brain.core.common.UtilCore;
import com.brain.core.dto.OrganizacionDto;
import com.brain.core.view.mbean.*;

import com.brain.core.exception.DAOException;
import com.brain.core.manager.BitacoraManager;
import com.brain.core.manager.RecursosManager;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import javax.faces.model.SelectItem;
import org.apache.log4j.Logger;
import org.primefaces.context.RequestContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

/**
 *
 * @author Indra
 */
@Controller("cotizacionProveedoresMBean")
@Scope("session")
public class CotizacionProveedoresMBean extends GenericMBean implements Serializable {

    private static Logger logger = Logger.getLogger(CotizacionProveedoresMBean.class);
    @Resource
    private CotizacionProveedoresManager manager;    
    @Resource
    private RecursosManager recursosManager;
    @Resource
    private BitacoraManager bitacoraManager;
    @Autowired
    private ApplicationMBean applicationMBean;
    @Resource
    private CotizacionProveedoresDetaManager detaManager;
    @Autowired
    private SessionMBean sessionMBean;
    private List<CotizacionProveedoresDto> lista;
    private CotizacionProveedoresDto dto;
    private CotizacionProveedoresDto dtoFiltro;
    private CotizacionProveedoresDetaDto dtoDeta;
    private SelectItem[] siEstadosFiltro;
    private String keyEntidad = "key.entidad.cotizacion.proveedores";
    private String keyEntidadDetalle = "key.entidad.cotizacion.proveedores.deta";
    private String tituloDetalle;
    private List<OrganizacionDto> listaOrganizaciones;
    private int estado;
    private boolean accesoAnulada;
    private boolean accesoConfirmada;
    private boolean accesoGuardar;

    public CotizacionProveedoresMBean() {
        this.dtoFiltro = new CotizacionProveedoresDto();
    }

    public String iniciar() {
        this.lista = null;
        this.dto = null;  
        this.dtoDeta = null;
        this.dtoFiltro = new CotizacionProveedoresDto();
        this.dtoFiltro.setDescripcion("");
        this.dtoFiltro.setDescripcionDetalle("");
        this.dtoFiltro.setTerceroDto(new TerceroDto());
        this.dtoFiltro.setEstado(ConstantesComp.ValoresConstantes.COT_PROVEEDORES_COD_ESTADO_TODOS);
        return manager.getUrlLista();
    }

    public String nuevo() {
        sessionMBean.setAccion(applicationMBean.getNuevo());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyEntidad, sessionMBean.getAccion()));
        this.dto = manager.inicializar();
        gestionAcceso();
        return manager.getUrl();
    }
    
    public void nuevoCotizacionProveedoresDeta() {
        sessionMBean.setAccionDetalle(applicationMBean.getNuevo());
        this.tituloDetalle = recursosManager.construirTitulo(keyEntidadDetalle, sessionMBean.getAccionDetalle());
        this.dtoDeta = this.detaManager.inicializar();
        this.dtoDeta.setCotizacionProveedoresDto(this.dto);
    }

    public String editar() {
        sessionMBean.setAccion(applicationMBean.getEditar());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyEntidad, sessionMBean.getAccion()));
        try {
            this.dto = manager.obtenerPorId(this.dto.getId());            
        } catch (DAOException ex) {
            logger.error(ex);
        }
        gestionAcceso();
        return manager.getUrl();
    }
    
    public void editarCotizacionProveedoresDeta() {
        this.tituloDetalle = recursosManager.construirTitulo(keyEntidadDetalle, sessionMBean.getAccionDetalle());
        sessionMBean.setAccionDetalle(applicationMBean.getEditar());
        try {
            this.dtoDeta = detaManager.obtenerPorId(this.dtoDeta.getId());
        } catch (DAOException ex) {
            logger.error(ex);
        }
    }

    public String ver() {
        sessionMBean.setAccion(applicationMBean.getVer());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyEntidad, sessionMBean.getAccion()));
        try {
            this.dto = manager.obtenerPorId(this.dto.getId());
        } catch (DAOException ex) {
            logger.error(ex);
        }
        gestionAcceso();
        return manager.getUrl();
    }
    
    public void verCotizacionProveedoresDeta() {
        this.tituloDetalle = recursosManager.construirTitulo(keyEntidadDetalle, sessionMBean.getAccionDetalle());
        sessionMBean.setAccionDetalle(applicationMBean.getVer());
        try {
            this.dtoDeta = detaManager.obtenerPorId(this.dtoDeta.getId());
        } catch (DAOException ex) {
            logger.error(ex);
        }
    }

    public void buscar() {
        try {
            List<CotizacionProveedoresDto> l = new ArrayList<CotizacionProveedoresDto>();
            this.lista = this.manager.obtener(this.dtoFiltro);
            if (!this.lista.isEmpty()) {
                for (CotizacionProveedoresDto x: this.lista) {
                    x.setUltimaModificacion(this.manager.obtenerCadenaUltimaModificacionLista(x));
                    l.add(x);
                }
                this.lista = l;
            }
        } catch (DAOException ex) {
            showError("ERROR_SISTEMA", ex.getMessage());
        }
    }

    public String guardar() {
        if (manager.guardar(this.dto) != null) {
            this.editar();
        }
        return null;
    }
    
    public void guardarCotizacionProveedores() {
        RequestContext context = RequestContext.getCurrentInstance();
        boolean flag = false;        
        try {
            flag = this.manager.verificarProducto(this.dto, this.dtoDeta);           
            if (flag){
                if (dtoDeta.getPrecioCompra().intValue() != 0){
                    if (detaManager.guardar(dtoDeta) != null) {
                        //Actualizamos la fecha de la ultima modificacion realizada
                        this.dto.setFecha(UtilCore.Fecha.obtenerFechaActualDate());
                        this.manager.guardar(this.dto);
                        //-------------------------------------------------------------------------
                        this.dto = this.manager.obtenerPorId(this.dto.getId());
                    }else{
                        flag = false;
                    }
                }
                else{
                    flag = false;
                    this.recursosManager.showError("DEBE INGRESAR UN PRECIO MAYOR A CERO");
                }
            }
            else { 
                this.recursosManager.showError("ESTE PRODUCTO YA SE ENCUENTRA REGISTRADO");
            }                       
        } catch (DAOException ex) {
            showError("ERROR_SISTEMA", ex.getMessage());
            logger.error(ex);
        }
        context.addCallbackParam("CallbackParam", flag);
    }

    public String retroceder() {
        buscar();
        return manager.getUrlLista();
    }
    
    public String verBitacora() { 
        bitacoraManager.cargarBitacoraEntidad(manager.getIdEntidad(), this.dto.getId());
        return null;
    }
    
    public void gestionAcceso() {
        this.accesoAnulada = false;
        this.accesoConfirmada = true;
        this.accesoGuardar = true;
        if (dto.getId() != null) {
            if (sessionMBean.getAccion() == applicationMBean.getEditar()){
                if (dto.getEstado().equals(ConstantesComp.ValoresConstantes.COT_PROVEEDORES_COD_ESTADO_ELABORACION)){
                    this.accesoAnulada = true;
                    this.accesoConfirmada = true;
                    this.accesoGuardar = true;
                }
                else if (dto.getEstado().equals(ConstantesComp.ValoresConstantes.COT_PROVEEDORES_COD_ESTADO_CONFIRMADO)){
                    this.accesoConfirmada = false;
                    this.accesoAnulada = true;
                    this.accesoGuardar = false;
                }
                else if (dto.getEstado().equals(ConstantesComp.ValoresConstantes.COT_PROVEEDORES_COD_ESTADO_ANULADO)){
                    this.accesoAnulada = false;
                    this.accesoConfirmada = false;
                    this.accesoGuardar = false;
                }
            }
            
            //Si la accion es = VER
            if (sessionMBean.getAccion() == applicationMBean.getVer()) {
                this.accesoAnulada = false;
                this.accesoConfirmada = false;
                this.accesoGuardar = false;
            }
        } else {
            this.accesoConfirmada = false;
        }
    }
    
    public void confirmar() {
        if (manager.verificarDetalles(dto)) {       
            dto.setEstado(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_ESTADO_CONFIRMADO);
            guardar();
        }
    }
    
    public void anular() {
        dto.setEstado(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_ESTADO_ANULADO);
        guardar();
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        CotizacionProveedoresMBean.logger = logger;
    }

    public CotizacionProveedoresManager getManager() {
        return manager;
    }

    public void setManager(CotizacionProveedoresManager manager) {
        this.manager = manager;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public ApplicationMBean getApplicationMBean() {
        return applicationMBean;
    }

    public void setApplicationMBean(ApplicationMBean applicationMBean) {
        this.applicationMBean = applicationMBean;
    }

    public SessionMBean getSessionMBean() {
        return sessionMBean;
    }

    public void setSessionMBean(SessionMBean sessionMBean) {
        this.sessionMBean = sessionMBean;
    }

    public List<CotizacionProveedoresDto> getLista() {
        return lista;
    }

    public void setLista(List<CotizacionProveedoresDto> lista) {
        this.lista = lista;
    }

    public CotizacionProveedoresDto getDto() {
        return dto;
    }

    public void setDto(CotizacionProveedoresDto dto) {
        this.dto = dto;
    }

    public CotizacionProveedoresDto getDtoFiltro() {
        return dtoFiltro;
    }

    public void setDtoFiltro(CotizacionProveedoresDto dtoFiltro) {
        this.dtoFiltro = dtoFiltro;
    }

    public String getKeyEntidad() {
        return keyEntidad;
    }

    public void setKeyEntidad(String keyEntidad) {
        this.keyEntidad = keyEntidad;
    }    

    public int getEstado() {
        return estado;
    }

    public void setEstado(int estado) {
        this.estado = estado;
    }

    public String getTituloDetalle() {
        return tituloDetalle;
    }

    public void setTituloDetalle(String tituloDetalle) {
        this.tituloDetalle = tituloDetalle;
    }

    public String getKeyEntidadDetalle() {
        return keyEntidadDetalle;
    }

    public void setKeyEntidadDetalle(String keyEntidadDetalle) {
        this.keyEntidadDetalle = keyEntidadDetalle;
    }

    public CotizacionProveedoresDetaDto getDtoDeta() {
        return dtoDeta;
    }

    public void setDtoDeta(CotizacionProveedoresDetaDto dtoDeta) {
        this.dtoDeta = dtoDeta;
    }

    public SelectItem[] getSiEstadosFiltro() {
        siEstadosFiltro = manager.siTiposCotizacionProveedoresTodos();
        return siEstadosFiltro;
    }

    public void setSiEstadosFiltro(SelectItem[] siEstadosFiltro) {
        this.siEstadosFiltro = siEstadosFiltro;
    }

    public boolean isAccesoAnulada() {
        return accesoAnulada;
    }

    public void setAccesoAnulada(boolean accesoAnulada) {
        this.accesoAnulada = accesoAnulada;
    }

    public boolean isAccesoConfirmada() {
        return accesoConfirmada;
    }

    public void setAccesoConfirmada(boolean accesoConfirmada) {
        this.accesoConfirmada = accesoConfirmada;
    }

    public boolean isAccesoGuardar() {
        return accesoGuardar;
    }

    public void setAccesoGuardar(boolean accesoGuardar) {
        this.accesoGuardar = accesoGuardar;
    }
}
